package com.gitee.swsk33.mainmodule.selector;

import com.gitee.swsk33.functionone.FunctionOneApplication;
import com.gitee.swsk33.functiontwo.FunctionTwoApplication;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * 实现ImportBeanDefinitionRegistrar接口后，可在其中使用自定义的逻辑，实现动态地将对应类注册为Bean
 */
public class DemoImportSelector implements ImportBeanDefinitionRegistrar {

	/**
	 * 定义一个自定义逻辑，在其中可以动态地将对应的类注册为Bean
	 *
	 * @param importingClassMetadata 标注了@Import注解的类的元数据
	 * @param registry               用于将指定类注册到IoC容器
	 */
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		// 注册两个功能模块中标注了@ComponentScan的类为Bean
		// 定义一个Bean定义对象，传入第一个模块的@ComponentScan配置类
		GenericBeanDefinition functionOneScanBean = new GenericBeanDefinition();
		functionOneScanBean.setBeanClass(FunctionOneApplication.class);
		// 表示第二个模块的Bean定义对象
		GenericBeanDefinition functionTwoScanBean = new GenericBeanDefinition();
		functionTwoScanBean.setBeanClass(FunctionTwoApplication.class);
		// 将两个定义对象进行注册，这样上述两个类就会被注册为Bean
		registry.registerBeanDefinition("functionOneComponentScan", functionOneScanBean);
		registry.registerBeanDefinition("functionTwoComponentScan", functionTwoScanBean);
	}

}